import os
import threading
import time
from typing import Dict

import requests
import yaml

from utils import ding_hook
from utils import tools


class Download(threading.Thread):
    # TODO : 可以改成带有进度条的下载方式, 可以改成下载开始就锁定, 再次执行到时不进行下载 ( 开始下载就写入配置文件 )
    def __init__(self, file_name, update_time, update_date, download_url, file_path, file_path_li=None):
        """
        下载文件时, 需要知道文件目录, 文件名称
            如果文件存在, 则不进行下载
            如果文件不存在, 则进行下载
        """
        super().__init__()
        self.file_name = file_name
        self.file_path = file_path
        self.update_time = update_time
        self.update_date = update_date
        self.download_url = download_url
        self.file_path_li = file_path_li

    def __download(self):
        """
        如果文件存在, 则不进行下载
        如果文件不存在, 则进行下载
        """
        if not os.path.exists(self.file_path):
            begin = time.time()
            tools.log.info(f'文件 < {self.file_name} > 开始下载')
            _res = requests.get(url=self.download_url)
            # 下载失败:
            if not _res:
                _json = _res.json()
                if isinstance(_json, Dict):
                    if 'token' in _json.get('message'):
                        tools.tools.cookie_useful(False)
                        tools.log.info(f'文件 < {self.file_name} > 下载失败, cookies 失效: {_res}, {_res.text}')
            # 开始下载:
            else:
                # tools.log.info(f'文件 < {self.file_name} > 下载中 ~~ ')
                with open(self.file_path, 'wb') as _f:
                    _f.write(_res.content)
                # ding_hook.ding_hook.new_apk(self.file_name)
                tools.log.info(f'文件 < {self.file_name} > 下载成功, 欧耶 ~~')
                tools.log.info(f'文件 < {self.file_name} > 下载耗时: {time.time() - begin}')
                ding_hook.ding_hook.new_apk(self.file_name, self.file_path_li)
                ding_hook.ding_hook.new_apk_link()
                tools.tools.cookie_useful(True)
        else:
            tools.log.info(f'文件 < {self.file_name} > 已经存在, 无需下载, 欧耶 ~~')
        return True

    def run(self):
        self.__download()


if __name__ == '__main__':

    """
    打开 yml 文件, 加载目录和下载 url, 进行下载
    """

    file = os.sep.join([os.path.dirname(__file__), 'conf', 'apk_health.yml'])
    with open(file, mode='r', encoding='utf8') as f:
        datas: dict = yaml.safe_load(f)
        print(datas)
        apk_info = []
        for k, v in datas.items():
            apk_info = v.get('apks')
            if apk_info:
                print(apk_info)

        d = Download(apk_info[0].get('file_name'), apk_info[0].get('update_time'), apk_info[0].get('update_date'), apk_info[0].get('download_url'), os.path.dirname(__file__))
        d.run()
